package per.hx.bs.sys.serviceimpl;

import com.alibaba.fastjson.JSON;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import per.hx.bs.base.domain.Tree;
import per.hx.bs.sys.dao.SysDeptDao;
import per.hx.bs.sys.dao.SysUserDao;
import per.hx.bs.entity.sys.SysDeptDO;
import per.hx.bs.util.BuildTree;

import java.util.*;

/**
 * @author HuXing
 * @date 2018/3/24  0:35
 */
@Transactional(rollbackFor = Exception.class)
@RestController
@RequestMapping(value = "sys-service/dept")
public class SysDeptApiServiceImpl {

    private final
    SysDeptDao sysDeptDao;
    private final
    SysUserDao sysUserDao;

    @Autowired
    public SysDeptApiServiceImpl(SysDeptDao sysDeptDao, SysUserDao sysUserDao) {
        this.sysDeptDao = sysDeptDao;
        this.sysUserDao = sysUserDao;
    }


    /**
     * 按条件获取部门信息
     *
     * @param map 查询条件
     * @return 部门信息
     */
    @PostMapping(value = "/list")
    public List<SysDeptDO> list(@RequestBody Map<String, Object> map) {
        return sysDeptDao.selectByMap(map);

    }

    /**
     * 按条件统计部门数量
     *
     * @param map 条件
     * @return 数量
     */
    @PostMapping(value = "/count")
    public int count(@RequestBody Map<String, Object> map) {
        return sysDeptDao.countByMap(map);
    }

    /**
     * 按条件统计部门下人员数量
     *
     * @param map 条件
     * @return 数量
     */
    @PostMapping(value = "/countUser")
    public int countUser(@RequestBody Map<String, Object> map) {
        return sysUserDao.countUser(map);
    }

    /**
     * 通过Id获取部门信息
     *
     * @param deptId 部门Id
     * @return 部门信息
     */
    @GetMapping(value = "/{deptId}")
    public SysDeptDO get(@PathVariable("deptId") Long deptId) {
        return sysDeptDao.selectById(deptId);
    }

    /**
     * 添加部门信息
     *
     * @param sysDeptDO 部门信息
     * @return 影响行数
     */
    @PostMapping(value = "/save")
    public int save(@RequestBody SysDeptDO sysDeptDO) {
        return sysDeptDao.insert(sysDeptDO);
    }

    /**
     * 修改部门信息
     *
     * @param sysDeptDO 部门信息
     * @return 影响行数
     */

    @PostMapping(value = "/update")
    public int update(@RequestBody SysDeptDO sysDeptDO) {
        return sysDeptDao.updateById(sysDeptDO);
    }

    /**
     * 删除部门信息
     *
     * @param deptId 部门id
     * @return 影响的行数
     */
    @DeleteMapping(value = "/remove")
    public int remove(@RequestParam("deptId") Long deptId) {
        return sysDeptDao.deleteById(deptId);
    }

    /**
     * 批量删除部门信息
     *
     * @param deptIds 部门id
     * @return 影响的行数
     */
    @DeleteMapping(value = "/batchRemove")
    public Integer batchRemove(@RequestParam("deptIds") Long[] deptIds) {
        return sysDeptDao.deleteBatchIds(Arrays.asList(deptIds));
    }

    /**
     * 获取 部门树
     *
     * @return 部门
     */
    @GetMapping(value = "/deptTree")
    public String getTree() {
        List<Tree<SysDeptDO>> trees = new ArrayList<>();
        List<SysDeptDO> sysDeptDOS = sysDeptDao.selectByMap(new HashMap<String, Object>(1));
        for (SysDeptDO sysDeptDO : sysDeptDOS) {
            Tree<SysDeptDO> tree = new Tree<>();
            tree.setId(sysDeptDO.getDeptId().toString());
            tree.setParentId(sysDeptDO.getParentId().toString());
            tree.setText(sysDeptDO.getName());
            Map<String, Object> state = new HashMap<>(16);
            state.put("opened", true);
            tree.setState(state);
            trees.add(tree);
        }
        return JSON.toJSONString(BuildTree.build(trees,null));
    }
}
